/**
 * 压缩dist目录
 */

const fs = require("fs");
const path = require("path");
const archiver = require("archiver");
const dayjs = require("dayjs");
const { name, version } = require("../package.json");

// 根目录
const rootDirs = path.resolve(__dirname, "../");
console.log("当前根目录", rootDirs);

/**
 * 压缩之前先清除之前的压缩包文件
 * @returns {Promise<boolean>} Promise对象
 */
async function cleanFileZips() {
  return new Promise((resolve, reject) => {
    fs.readdir(rootDirs, (err, files) => {
      if (err) {
        console.error("无法读取当前目录", err);
        reject(false);
      }

      const extnameArrs = [".zip", ".gz", ".rar"]; // 后缀名数组
      // 判断是否包含压缩扩展名
      const isExist = files.some(file => extnameArrs.includes(path.extname(file)));
      if (isExist === false) {
        console.error("当前目录中不存在压缩包");
        resolve(true);
      }
      // 遍历文件
      files.forEach(file => {
        // console.log("file", file);
        // 获取文件扩展名
        const extname = path.extname(file);
        if (extnameArrs.includes(extname)) {
          // 包含压缩包扩展名即删除
          const filePath = path.resolve(rootDirs, file);
          // fs删除方法
          fs.unlink(filePath, err => {
            if (err) {
              console.error("无法删除文件", err);
              reject(false);
            }
            console.log("删除文件成功", file);
            resolve(true);
          });
        }
      });
    });
  });
}

/**
 * 压缩dist目录
 */
function zipDistDirectory() {
  // dist文件目录
  const directoryPath = path.resolve(rootDirs, "dist");
  // 压缩包的命名：name+version+date+zip
  const filename = `${name}-${version}-${dayjs().format("YYYYMMDDHHmmss")}.zip`;
  const outputFilePath = path.resolve(rootDirs, filename);

  // 递归加入文件
  const { isLegal, errMsg } = isLegalFileDirectory(directoryPath);
  if (isLegal === false) {
    console.error(errMsg);
    return;
  }

  // 创建写入流
  const output = fs.createWriteStream(outputFilePath);
  // 创建压缩流对象
  const archive = archiver("zip", {
    zlib: { level: 9 } // 设置压缩级别(最高压缩率)
  });

  // 监听错误
  archive.on("error", err => {
    throw err;
  });

  // 将archive管道连接到可写流
  archive.pipe(output);

  // 添加目录到archive对象
  archive.directory(directoryPath, false);

  // 完成归档并关闭输出流
  archive.finalize();

  console.log(`Successful compressed directory ${filename}`);
}

/**
 * @param {string} dir 目录
 * @returns {{isLegal: boolean, errMsg: string}} 合法信息对象
 */
function isLegalFileDirectory(dir) {
  // 先判断dir文件是否存在
  if (fs.existsSync(dir) === false) {
    const errMsg = `${dir} 文件不存在`;
    return { isLegal: false, errMsg };
  }
  // 再判断dir是否是合法的目录
  if (fs.lstatSync(dir).isDirectory() === false) {
    const errMsg = `${dir} 不是合法的目录`;
    return { isLegal: false, errMsg };
  }
  return { isLegal: true };
}

// 执行
async function run() {
  const res = await cleanFileZips();
  if (res === true) {
    console.log("开始压缩dist目录");
    zipDistDirectory();
  }
}

run();
